/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.controlador;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.logging.Level;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.log4j.Logger;
import org.primefaces.event.SelectEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.common.IObserver;
import pe.com.cotelasa.scp.common.ISubject;
import pe.com.cotelasa.scp.controlador.backingBean.BKComponenteFindAddArticulo;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioArticulo;
import pe.com.cotelasa.scp.dominio.service.IServicioArticuloSede;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoUnidadMinima;
import pe.com.cotelasa.scp.dominio.service.IServicioUnidadMedidaComp;
import pe.com.cotelasa.scp.entidad.Articulo;
import pe.com.cotelasa.scp.entidad.ArticuloSede;
import pe.com.cotelasa.scp.entidad.ArticuloSedePK;
import pe.com.cotelasa.scp.entidad.UnidadMedidaComp;
import pe.com.cotelasa.scp.entidad.VentaDetalleFacturacion;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

/**
 *
 * @author Jorge
 */
@SuppressWarnings("serial")
@Named(value = "MBComponenteFindAddArticulo")
@Scope("request")
public final class MBComponenteFindAddArticulo extends MBGenerico implements ISubject, Serializable {

    private static Logger logger = Logger.getLogger(MBComponenteFindCliente.class);
    @Inject
    private BKComponenteFindAddArticulo bkComponenteFindAddArticulo;
    /*@Inject
     private IServicioArticulo servicioArticulo;*/
    @Inject
    private IServicioUnidadMedidaComp servicioUnidadMedidaComp;
    @Inject
    private IServicioArticuloSede servicioArticuloSede;
    /*@Inject
     private IServicioTipoUnidadMinima servicioTipoUnidadMinima;*/
    @Autowired
    BKSession session;

    public void carga(ActionEvent actionEvent) {
        bkComponenteFindAddArticulo.setListaArticulos(new ArrayList<ArticuloSede>());
        bkComponenteFindAddArticulo.setListaDetalleUsados((List<VentaDetalleFacturacion>) actionEvent.getComponent().getAttributes().get("listaDetalle"));

        /*for (VentaDetalleFacturacion det : bkComponenteFindAddArticulo.getListaDetalleUsados()) {
            //System.out.println("articulo usado: " + det.getCodarticulo().getNombreComercial());
        }*/

        bkComponenteFindAddArticulo.setArticuloSeleccionado(new ArticuloSede());
        bkComponenteFindAddArticulo.setCantidad(0);
        bkComponenteFindAddArticulo.setPrecioUnitario(0);
        bkComponenteFindAddArticulo.setIdUnidadMedida(0);
        bkComponenteFindAddArticulo.setArticulo("");
        bkComponenteFindAddArticulo.setDescripcion("");
        bkComponenteFindAddArticulo.setEmpaque("");
        bkComponenteFindAddArticulo.setCantidadEmpaque(0);
    }

    public void cargaInicial() {
        try {
            bkComponenteFindAddArticulo.setListaUnidadMedida(new ArrayList<UnidadMedidaComp>(servicioUnidadMedidaComp.listarUnidadMedidaCompsActivos()));
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public void buscarArticulos() {
        ArticuloSede artS = new ArticuloSede();
        artS.setId(new ArticuloSedePK());
        artS.getId().setIdEmpresa(session.getEmpresa().getId());
        artS.getId().setIdSede(session.getSede().getId());
        artS.setArticulo(new Articulo());
        artS.getArticulo().setNombreComercial(bkComponenteFindAddArticulo.getArticulo());
        try {
            //bkComponenteFindAddArticulo.setListaArticulos(servicioArticuloSede.listaArticulosPorNombre(artS));

            bkComponenteFindAddArticulo.setListaArticulos(new ArrayList<ArticuloSede>());
            Collection<ArticuloSede> listaArticulosSede = new ArrayList<ArticuloSede>();
            for (ArticuloSede art : servicioArticuloSede.listaArticulosPorNombre(artS)) {
                ArticuloSede art1 = new ArticuloSede();
                art1.setId(art.getId());
                art1.setArticulo(art.getArticulo());
                art1.setPartidaLote(art.getPartidaLote());
                art1.setCaStockDisponible(art.getCaStockDisponible());
                art1.setVaCosto(art.getVaCosto());
                art1.setUnidadMedida(art.getUnidadMedida());
                listaArticulosSede.add(art1);
            }
            for (ArticuloSede prod : listaArticulosSede) {
                double cant = prod.getCaStockDisponible().doubleValue();
                System.out.println("prod total del articulo " + prod.getArticulo().getNombreComercial() + " = " + cant);
                for (VentaDetalleFacturacion det : bkComponenteFindAddArticulo.getListaDetalleUsados()) {
                    if (prod.getArticulo().equals(det.getCodarticulo())
                            && prod.getPartidaLote().equals(det.getPartida())) {
                        System.out.println("prod consumido del articulo " + prod.getArticulo().getNombreComercial() + " = " + det.getCantidad());
                        cant = cant - det.getCantidad();
                    }
                }

                if (cant > 0) {
                    prod.setCaStockDisponible(new BigDecimal(cant));
                    bkComponenteFindAddArticulo.getListaArticulos().add(prod);
                }

            }


        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public void accion(ActionEvent actionEvent) {
        bkComponenteFindAddArticulo.setCantidad(bkComponenteFindAddArticulo.getCantidad());
        System.out.println(bkComponenteFindAddArticulo.getCantidad());
    }

    public void clearObserver() {
        bkComponenteFindAddArticulo.getObservers().clear();
    }

    @Override
    public void addObserver(IObserver observador) {
        bkComponenteFindAddArticulo.addObservers(observador);
    }

    @Override
    public void notificarObservadores() {
        //try {
        //bkComponenteFindAddArticulo.setUnidadMedida(servicioTipoUnidadMinima.conseguirTipoUnidadMinimaPorId(bkComponenteFindAddArticulo.getIdUnidadMedida()));
        for (IObserver observer : bkComponenteFindAddArticulo.getObservers()) {
            observer.actualizarObservador(bkComponenteFindAddArticulo);
        }
        /*} catch (ServiceException e) {
         mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
         logger.error(e.getMessage(), e);
         }*/



    }

    public void seleccionarArticulo(SelectEvent event) {

        bkComponenteFindAddArticulo.setCantidad(0);
        bkComponenteFindAddArticulo.setPrecioUnitario(0);
        ArticuloSede artSede = (ArticuloSede) event.getObject();
        bkComponenteFindAddArticulo.setDescripcion(artSede.getArticulo().getModelo() + " " + artSede.getArticulo().getDetalle());
    }
}
